package daos;

import java.util.ArrayList;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import entidades.Usuario;


public class UsuariosDAO {
	private Session sesion;
	private Transaction tx;

	public Integer guardaUsuario(Usuario usuario) throws HibernateException {
		Integer id = 0;

		try {
			iniciaOperacion();
			id = (Integer) sesion.save(usuario);
			tx.commit();
		} catch (HibernateException he) {
			manejaExcepcion(he);
			throw he;
		} finally {
			sesion.close();
		}

		return id;
	}

	public void actualizaUsuario(Usuario usuario) throws HibernateException {
		try {
			iniciaOperacion();
			sesion.update(usuario);
			tx.commit();
		} catch (HibernateException he) {
			manejaExcepcion(he);
			throw he;
		} finally {
			sesion.close();
		}
	}

	public void eliminaUsuario(Usuario usuario) throws HibernateException {
		try {
			iniciaOperacion();
			sesion.delete(usuario);
			tx.commit();
		} catch (HibernateException he) {
			manejaExcepcion(he);
			throw he;
		} finally {
			sesion.close();
		}
	}

	public Usuario obtenUsuario(Integer idUsuario)
			throws HibernateException {
		Usuario usuario = null;
		try {
			iniciaOperacion();
			usuario = (Usuario) sesion.get(Usuario.class,
					idUsuario);
		} finally {
			sesion.close();
		}

		return usuario;
	}
	

	@SuppressWarnings("unchecked")
	public ArrayList<Usuario> obtenListaUsuarios() throws HibernateException {
		ArrayList<Usuario> listaUsuarios = new ArrayList<Usuario>();

		try {
			iniciaOperacion();
			listaUsuarios = new ArrayList<Usuario>(sesion.createQuery("from Usuario").list());
		} finally {
			sesion.close();
		}

		return listaUsuarios;
	}

	@SuppressWarnings("unchecked")
	public Usuario consultarUsuario(String s) throws HibernateException {
		ArrayList<Usuario> listaUsuarios = new ArrayList<Usuario>();
		Usuario u = null;

		try {
			iniciaOperacion();
			Query q = sesion.createSQLQuery("SELECT * FROM usuario WHERE login = :string ").addEntity(Usuario.class);
//			Query q = sesion.createQuery("from Material as m where m.descripcion = :string");
			q.setParameter("string", s);
		
			listaUsuarios = new ArrayList<Usuario>(q.list());
			if(!listaUsuarios.isEmpty())
				u = listaUsuarios.get(0);
		} finally {
			sesion.close();
		}

		return u;
	}
	private void iniciaOperacion() throws HibernateException {
		sesion = HibernateUtil.getSessionFactory().openSession();
		tx = sesion.beginTransaction();
	}

	private void manejaExcepcion(HibernateException he)
			throws HibernateException {
		tx.rollback();
		throw new HibernateException(
				"Ocurrió un error en la capa de acceso a datos", he);
	}
}
